Шаг 51 - CreateDispTypelnfo.

Создает упрощенную информацию о типе, которую может использовать реализация IDispatch.

HRESULT CreateDispTypeInfo
(
INTERFACEDATA  pidata,
LCID kid,
ITypelnfo FAR* FAR*pptinfo
);

Параметры
pidata
Описание интерфейса, для которого создается информация о типе.
lcid
Идентификатор местности для имен, используемых в информации о типе.
pptinfo
После возврата содержит указатель на реализацию информации о типе, которую можно использовать с DispGetlDsOfNames и Displnvoke.

Коды возврата
Из возвращенного HRESULT получают один из следующих кодов возврата:
Код возврата Значение
S_OK Интерфейс поддерживается.
E_INVALIDARG Либо описание интерфейса, либо LCID неверны.
E_OUTOFMEMORY He хватает памяти для выполнения операции.

Комментарии
Вы можете создать информацию о типе во время исполнения, используя CreateDispTypelnfo и структуру INTERFACEDATA, которая описывает предоставляемый объект.
Информация о типе, возвращаемая данной функцией, предназначена главным образом для того, чтобы автоматизировать реализацию IDispatch. CreateDispTypelnfo возвращает не всю информацию о типе. Аргумент pidata — это не полное описание интерфейса. Он не содержит информации для справочной системы, комментариев, необязательных параметров и другой информации о типе, полезной в иных контекстах.
В связи с этим рекомендуется использовать другой способ предоставления информации о типе для объекта, а именно описание объекта на языке ODL и компиляцию этого описания в библиотеку типа с помощью компилятора MIDL или утилиты MkTypLib.
Вы можете воспользоваться информацией из библиотеки типа с помощью функций LoadTypeLib и GetTypelnfoOfGuid вместо CreateDispTypelnfo.

Пример
Приведенный ниже код создает информацию о типе из INTERFACEDATA для предоставления объекта CCalc.

static METHODDATA NEARDATA rgmdataCCalc [] =
{
PROPERTY(VALUE,	IMETH_ACCUM,		IDMEMBER.ACCUM,	VT_I4)
PROPERTY(ACCUM,	IMETH_ACCUM,		IDMEMBER_ACCUM,	VT_I4)
PROPERTY(OPND,	IMETH_OPERAND,	IDMEMBER_OPERAND,	VT_I4)
PROPERTY(OP,		IMETH_OPERATOR,	IDMEMBER_OPERATOR,	VT_I2)
METHODO(EVAL,		IMETH_EVAL,		IDMEMBER_EVAL,	VT_BOOL)
METHODO(CLEAR,	IMETH_CLEAR,		IDMEMBER_CLEAR,	VT_EMPTY)
METHODO(DISPLAY,	IMETH_DISPLAY,		IDMEMBER_DISPLAY,	VT_EMPTY)
METHODO(QUIT,		IMETH_QUIT,		IDMEMBER_QUIT,		VT_EMPTY)
METHOD1(BUTTON,	IMETH_BUTTON,		IDMEMBER_BUTTON,	VT_BOOL)
}

INTERFACEDATA NEARDATA g_idataCCalc = 
{
rgmdataCCalc, DIM(rgmdataCCalc)
}

// Реализация IDispatch с помощью диспетчерских функций API.
CCalc FAR*	
CCalc: :Create() 
{
HRESULT hresult;
CCalc FAR* pcalc;
CArith FAR* parith;
ITypelnfo FAR* ptinfo;
IUnknown FAR* punkStdDisp; 

extern INTERFACEDATA NEARDATA g_idataCCalc;

if ((pcalc = new FAR CCalc()) == NULL)
	return NULL; 

pcalc->AddRef();
parith = &(pcalc->m_arith);

// Построить информацию о типе для функциональности данного объекта, 
// которая предоставляется для программного доступа извне.

hresult = CreateDispTypeInfo(
&g_idataCCalc, LOCALE_SYSTEM_DEFAULT, &ptinfo); 
if (hresult != NOERROR)
goto LErrorO;

// Создать агрегат с экземпляром стандартной реализации IDispatch, 
// инициализированной с помощью информации о типе.

hresult = CreateStdDispatch(
pcalc,     // Управляющий IUnknown.
parith,    // Экземпляр для распределения вызовов.
ptinfo,    // Информация о типе, описывающая экземпляр.
&punkStdDisp);

ptinfo->Release();
if (hresult != NOERROR) goto LErrorO;
pcalc->m_punkStdDisp = punkStdDisp; 
return pcalc;

LErrorO: ;
pcalc->Release(); 
return NULL;
}
Hosted by uCoz